#include "client.h"
#include "common_head.h"

// 参数1：文件描述符用于tcp通信
// 参数2：data结构体，用于获取cd的文件路径
// 参数3:当前用户显示的工作路径
int handler_cd(int socket, data msg, char *wk_path){
    //记录初始命令参数
    char buf_curr[1024] = {0};
    strcpy(buf_curr, msg.args);
    //接受服务端的判断路径是否存在的返回值
    int flag = -10000000;
    char path[1024] = {0};
    strcpy(path, wk_path);
    printf("初始路径 = %s\n", path);
    // 发送带有操作和操作参数的结构体用于服务端进入函数
    int ret = send(socket, &msg, sizeof(msg), MSG_NOSIGNAL);
    ERROR_CHECK(ret, -1, "1send_cd_error");
    // 初始化结构体用来存储改变之后的路径
    memset(&msg, 0, sizeof(data));
    // 处理客户端显示路径逻辑
    // int count = 0; //记录回退次数
    if (!strcmp(buf_curr, "") || !strcmp(buf_curr, "~") || !strcmp(buf_curr, "/"))
    {
        // 回退到根目录逻辑
        strcpy(path, "/");
        //将回退之后的路径发送给服务器服务器判断路径是否存在
        strcpy(msg.args, path);
        //msg.args[sizeof(msg.args) - 1] = '\0'; // 确保字符串以 null 结尾
        ret = send(socket, &msg, sizeof(data), MSG_NOSIGNAL);
        ERROR_CHECK(ret, -1, "2send_cd_error");
        //接收服务端返回标记
        recv(socket, &flag, sizeof(flag), MSG_WAITALL);
        if(flag == 0){
            printf("没有那个文件或目录\n");
            return 0;
        }
        if(flag > 0){
            strcpy(wk_path, path);
            return 0;
        }
    }
    if (buf_curr[0] == '.'){
        // 回退部分路径逻辑
        // 计算命令长度
        int order_len = strlen(buf_curr);
        // 计算路径长度
        int path_len = strlen(path);
        char *replace = "\0"; // 用于替换
        int count = 0;        // 记录回退次数
        int count_sigl = 0;   // 记录"/"的个数
        for (int i = 0; i < order_len; i++){
            if (buf_curr[i] == '.' && order_len > 1){
                //..为两个出现
                i += 1;
                count++;
            }
        }
        printf("path = %s\n", path);
        for(int k = path_len; k >= 0; k--){
            if (path[k] == '/'){
                count_sigl++;
            }
        }
        printf("count = %d, count_sigl = %d\n", count, count_sigl);
        // 回退客户端的路径
        if(count == count_sigl){
            //回退到根路径
            strcpy(path, "/");
        }else if(count > count_sigl){
            //回退次数过多，回退到根目录之前
            strcpy(path, "///////");
        }else{
            for(int j = path_len; j >= 0; j--){
                if (path[j] == '/' && count > 0){
                // 将'/'修改为'\0'
                path[j] = *replace;
                count--;
                }
            }
        }
        strcpy(msg.args, path);
        //msg.args[sizeof(msg.args) - 1] = '\0'; // 确保字符串以 null 结尾
        printf("发送的回退的路径 = %s\n", msg.args);
        ret = send(socket, &msg, sizeof(data), MSG_NOSIGNAL);
        ERROR_CHECK(ret, -1, "2send_cd_error");
        //接收服务端返回标记
        recv(socket, &flag, sizeof(flag), MSG_WAITALL);
        if(flag == 0){
            printf("没有那个文件或目录\n");
            return 0;
        }
        if(flag > 0){
            strcpy(wk_path, path);
            return 0;
        }
    }
    if (buf_curr != NULL && sizeof(buf_curr) > 0 && buf_curr[0] != '~')
    {
        // 前进客户端路径
        if(!strcmp(path, "/")){
            strcat(path, buf_curr);
        }else if(buf_curr[0] != '/'){
            char *curr = "/";
            strcat(path, curr);
            strcat(path, buf_curr);
        }else if(buf_curr[0] = '/'){
            strcpy(path, buf_curr);
        }
        //char *curr = "/";
        //strcat(path, curr);
        //将回退之后的路径发送给服务器服务器判断路径是否存在
        strcpy(msg.args, path);
        //printf("客户端发送路径 = %s\n", msg.args);
        //msg.args[sizeof(msg.args) - 1] = '\0'; // 确保字符串以 null 结尾
        ret = send(socket, &msg, sizeof(data), MSG_NOSIGNAL);
        ERROR_CHECK(ret, -1, "3send_cd_error");
        //接收服务端返回标记
        recv(socket, &flag, sizeof(flag), MSG_WAITALL);
        //printf("接收到的返回值%d\n", flag);
        if(flag == 0){
            printf("没有那个文件或目录\n");
            return 0;
        }
        if(flag > 0){
            strcpy(wk_path, path);
            //char *curr = "/";
            //strcat(wk_path, curr);
            return 0;
        }
    }
    return 0;
}
